package br.com.persistence;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;

import br.com.model.Usuario;
import br.com.model.Pergunta;
import br.com.model.Questionario;

@ManagedBean(name="questionarioDao", eager = true)
public class QuestionarioDao extends Conexao implements InterfaceDao<Questionario> {

	@Override
	public boolean insert(Questionario quest) {

		try (Connection conexao = getConexao()) {

			//cadastra o questionario
			String sql = "INSERT INTO questionario(idUsuario, data) VALUES (?,?)";
			PreparedStatement stmt = conexao.prepareStatement(sql);
			stmt.setInt(1, quest.getUsuario().getIdUsuario());
			stmt.setDate(2, quest.getDia());
			stmt.execute();
			
			//retorna o ultimo questionario cadastrado pelo usuario com o id
			selectOne(quest);
			
			//cadastra as perguntas e respostas do questionario feito pelo aluno
			sql = "INSERT INTO questionarioPerguntaResposta(idQuestionario, idPergunta, idResposta) VALUES (?,?,?)";
			stmt = conexao.prepareStatement(sql);
			
			for (int i = 0; i < quest.getPerguntas().size(); i++) {
				
				stmt.setInt(1, quest.getIdQuestionario());
				stmt.setInt(2, quest.getPerguntas().get(i).getIdPergunta());
				stmt.setInt(3, quest.getPerguntas().get(i).getRespondido().getIdResposta());
				stmt.execute();
			}
			
			
			return true;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println(e.getMessage());
			return false;
		}
	}
	
	//retorna o ultimo questionario respondido pelo usuario
	@Override
	public boolean selectOne(Questionario quest){
		String sql = 
				"SELECT idQuestionario FROM	questionario WHERE idUsuario = ? ORDER BY idQuestionario DESC LIMIT 1";
				
				try (Connection conexao = getConexao()) {
					
					PreparedStatement stmt = conexao.prepareStatement(sql);
					stmt.setInt(1, quest.getUsuario().getIdUsuario());
					ResultSet res = stmt.executeQuery();

					while(res.next()){
						quest.setIdQuestionario(res.getInt("idQuestionario"));
					}
					return true;
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					System.out.println(e.getMessage());
					return false;
				}
	}

	@Override
	public boolean update(Questionario quest) {
		// TODO Auto-generated method stub
		return false;
	}

	private List<Questionario> getList(ResultSet res) throws SQLException {

		List<Questionario> lista = new ArrayList<Questionario>();
		
		Questionario q = new Questionario();
		Pergunta p;
		Usuario u;
		int idQ=0;
	
		while (res.next()) {
			//confere o id do questionario para que ele seja instanciado apenas qdo trocar o id
			if(res.getInt("idQuestionario") != idQ){
				//aproveita para setar USUARIO, DATA e idQUESTIONARIO
				idQ = res.getInt("idQuestionario");
				q = new Questionario();
				
				//seta usuario
				u = q.getUsuario();//usei o usuario do questionario para nao instanciar outro
				u.setIdUsuario(res.getInt("idUsuario"));
				u.setNome(res.getString("nome"));
				
				//seta id do questionario e o dia
				q.setIdQuestionario(idQ);
				q.setUsuario(u);
				q.setDia(res.getDate("data"));
				
				//adiciona o questionario na lista
				lista.add(q);
			}
			
			p = new Pergunta();
			//seta a pergunta
			p.setIdPergunta(res.getInt("idPergunta"));
			p.setPergunta(res.getString("pergunta"));
			//seta a resposta correta da pergunta
			p.getResposta().setIdResposta(res.getInt(4));//retorna o valor da coluna 4
			p.getResposta().setResposta(res.getString(5));//retorna o valor da coluna 5
			//seta a resposta do aluno para a pergunta
			p.getRespondido().setIdResposta(res.getInt(6));//retorna o valor da coluna 7
			p.getRespondido().setResposta(res.getString(7));//retorna o valor da coluna 7
			
			//adiciona pergunta no questionario
			q.addPergunta(p);

		}
		
		return lista;
	}

	public List<Questionario> selectList(Usuario usuario) {

			String sql = 
			"SELECT q.idQuestionario, p.idPergunta, p.pergunta, p.idResposta, r.resposta, qpr.idResposta, rd.resposta, q.idUsuario, q.data, u.nome "
			+ "FROM questionarioperguntaresposta qpr, pergunta p, resposta r, questionario q, resposta rd, usuario u "
			+ "WHERE (qpr.idQuestionario = q.idQuestionario "
			+ "AND qpr.idPergunta = p.idPergunta "
			+ "AND rd.idResposta =qpr.idResposta "
			+ "AND r.idResposta = p.idResposta "
			+ "AND u.idUsuario = q.idUsuario) "
			+ "AND (u.idUsuario = ? OR u.nome = ?) "
			+ "ORDER BY q.idQuestionario";
			
			try (Connection conexao = getConexao()) {
				
				PreparedStatement stmt = conexao.prepareStatement(sql);
				stmt.setInt(1, usuario.getIdUsuario());
				stmt.setString(2, usuario.getNome());
				ResultSet res = stmt.executeQuery();

				return this.getList(res);
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				System.out.println(e.getMessage());
				return null;
			}
	}

	@Override
	public List<Questionario> selectList() {
		String sql = 
				"SELECT q.idQuestionario, p.idPergunta, p.pergunta, p.idResposta, r.resposta, qpr.idResposta, rd.resposta, q.idUsuario, q.data, u.nome "
				+ "FROM questionarioperguntaresposta qpr, pergunta p, resposta r, questionario q, resposta rd, usuario u "
				+ "WHERE qpr.idQuestionario = q.idQuestionario "
				+ "AND qpr.idPergunta = p.idPergunta "
				+ "AND rd.idResposta =qpr.idResposta "
				+ "AND r.idResposta = p.idResposta "
				+ "AND u.idUsuario = q.idUsuario "
				+ "ORDER BY q.idQuestionario";
		
		try (Connection conexao = getConexao()) {
			
			PreparedStatement stmt = conexao.prepareStatement(sql);
			ResultSet res = stmt.executeQuery();

			return this.getList(res);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println(e.getMessage());
			return null;
		}
	}

	@Override
	public boolean delete(Questionario quest) {
		// TODO Auto-generated method stub
		return false;
	}


}
